<?php
/**
 * Управления темами оформления в системе.
 * Установка путей для скриптов вида layout и для шаблонов вида.
 * 
 * @author nrnwest@gmail.com
 *
 */
class Arm_Themes
{
  
   /**
    * Интерфейсы и темы, интерфейс ключ значение - названия темы.
    * @var array
    */
   private $_themes = null;
    
   /**
    * названия модуля - default
    * @var string
    */
   private $_module = null;
   
   /**
    * названия контролера - index
    * @var string 
    */
   private $_controller = null;
   
   /**
    * названия группы пользователя
    * @var string
    */
   private $_group;
   
   private $_isAdmin = null;
   
   private $_themePathModule = null;
   
  /**
   * Установка интерфейсов, и текущих к ним тем.
   * @param array $themes user=>default admin=>default
   */
  public function __construct(array $themes = array(), $groupUser=null)
  {
    $this->_themes = $themes;
    if($groupUser === null) {
        $this->_group = Arm_User::getInstance()->getGroup();
    } else {
        $this->_group  = $groupUser;
    }
  }
  
  /**
   * Установка имени модуля и контролера.
   * 
   * @param string $module названия модуля - default
   * @param string $controller названия контролера - index
   */
  public function setNameModuleControler($module, $controller)
  {
     $this->_module     = strtolower($module);
     $this->_controller = strtolower($controller);
  }
  
  /**
   * Определяет загружаеться админ интерфейс или польователський, с учетом группы текущего пользователя
   * 
   * @return bool
   */
  public function isAdmin()
  {
      if($this->_isAdmin !== null) {
          return $this->_isAdmin;
      }
     if((strpos('admin', $this->_controller) === 0 or $this->_module === 'admin') and $this->_group === Arm_Acl::GROUP_ADMIN) {
          $this->_isAdmin = true;   
        } else {
          $this->_isAdmin = false;  
        }
        
        return $this->_isAdmin;
  }
  
  /**
   * Вернет названия текущей темы.
   */
  public function getNameTheme()
  {
    if($this->isAdmin()) {
        return $this->_themes['admin'];
    }
    return $this->_themes['user'];
  }
  
  /**
   * Установка пути к теме в layout
   * @param string|null $interFace директория интерфейса  
   * @param string|null $theme текущая тема
   * @return string путь к текущей теме .../aplication/layout/default/
   */
  public function setThemePathLayout($interFace = null, $theme = null)
  {
      if($this->_module === null) {
          throw new Arm_Themes_Exception(Arm_Translate::_('Вы долждны установить текущий модуль через метод setNameModuleControler'));
      }
      
      if($interFace === null) {
          $interFace = $this->isAdmin() ? 'admin' : 'user';
      } 
     
     if($theme === null) {
         $theme = $this->_themes[$interFace];
     }
     
     $path = Arm_Core::getPathLayouts() . $interFace . DIRECTORY_SEPARATOR; 
     if(false === is_dir($path)) {
         throw new Arm_Themes_Exception(Arm_Translate::_('Не существует директории интефейса "%s"', $path));
     }

     $path .=  $theme . DIRECTORY_SEPARATOR;

    
     if(false === is_dir($path)) {
         throw new Arm_Themes_Exception(Arm_Translate::_('Не существует директории темы "%s"', $path));
     }
     return $path;
  }
  
  /**
   * Установка пути к теме, в директории модуля.
   * @param string|null $theme
   */
  public function setThemePathModule($interFace = null, $theme = null)
  {
      if($this->_module === null) {
          throw new Arm_Themes_Exception(Arm_Translate::_('Вы должны установить текущий модуль через метод setNameModuleControler'));
      }
      
      if($interFace === null) {
         $interFace = $this->isAdmin() ? 'admin' : 'user';
     } 
     
     if($theme === null) {
         $theme = $this->_themes[$interFace];
     }
     
     
     $path =   Arm_Core::getPathModule($this->_module) . 'views/' . $interFace . '/' . $theme . '/';
     if(false === is_dir($path)) {
          throw new Arm_Themes_Exception(Arm_Translate::_('Не доступна директория темы: "%s"', $path));
     }
     $this->_themePathModule = $path;
     return $this->_themePathModule;
  }
  
  public function getThemePathModule()
  {
      return $this->_themePathModule;
  }
  
  /**
   * Установка темы с учетом группы - пользователя, с учетом вызвыаемого контролера admin|user, модуля admin или другого.
   * @param unknown_type $interFace
   * @param unknown_type $theme
   */
  public function setTheme($interFace = null, $theme = null)
  {
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        // Устаналвиваем пути
        $pathModule = $this->setThemePathModule($interFace, $theme);
   
        $pathLayout = $this->setThemePathLayout($interFace, $theme);
        $viewRenderer->setView($this->_initView($viewRenderer->view, $pathModule, $pathLayout));    
        // установка layout
       $this->_initLayout($pathLayout);
  }
  
  /**
   * Иницилизация Zend_Layout
   * @param $path
   * @return Zend_Layout
   */
  protected function _initLayout($path)
  {
    // октлючаем layout если ajax запрос.
      if(Zend_Controller_Front::getInstance()->getRequest()->isXmlHttpRequest()) {
           return;
      }

    $path = rtrim($path, '/\\') . '/';
    return  Zend_Layout::startMvc(array('layoutPath'=>$path . 'scripts/'));
  }
  
  /**
   * Установка настроек в объект view
   * @param $view
   * @param $pathModule
   */
  protected function _initView(Zend_View $view, $pathModule, $pathLayout)
  {
        $pathModule = rtrim($pathModule, '/\\') . '/'; 
        $view->setScriptPath($pathModule . 'scripts/');
        // устновка пощников и фильтров Zend
        $view->setHelperPath('Zend/View/Helper/', 'Zend_View_Helper_');
        $view->setFilterPath( 'Zend/View/Filter/', 'Zend_View_Filter_');
        // Arm
        $view->addFilterPath(Arm_Core::getPathLibrary() . 'Arm/View/Filter/', 'Arm_View_Filter_');
        $view->addHelperPath(Arm_Core::getPathLibrary() . 'Arm/View/Helper/', 'Arm_View_Helper_');
        // Тема
        $view->addFilterPath($pathLayout . 'filters/', 'Layoyt_View_Filter_');
        $view->addHelperPath($pathLayout . 'helpers/', 'Layoyt_View_Helper_');
        // Модуля
        $view->addFilterPath($pathModule . 'filters/', ucfirst($this->_module) . '_View_Filter_');
        $view->addHelperPath($pathModule . 'helpers/', ucfirst($this->_module) . '_View_Helper_');
        return $view;
  }
  
  
  /**
   * Установка Любой темы для контролеров модуля.
   * 
   */
  public function setOtherThemeModule($module, $themeName)
  {
      $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
      $pathModule   = Arm_Core::getPathModule($module) . 'views/' . $themeName . '/';
      $pathLayout   = Arm_Core::getPathModule($module) . 'layouts/' . $themeName . '/';
      $viewRenderer->setView($this->_initView($viewRenderer->view, $pathModule, $pathLayout));
      $this->_initLayout($pathLayout);
      return;   
  }
  
  
  
}